]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
shellDBus: Add the Shell.Brightness interface
authorSebastian Wick <sebastian.wick@redhat.com>
Sat, 21 Jun 2025 22:12:09 +0000 (00:12 +0200)
committerSebastian Wick <sebastian.wick@redhat.com>
Sun, 3 Aug 2025 01:34:28 +0000 (03:34 +0200)
This lets gnome-settings-daemon control dimming for power saving, and
set a auto brightness target for brightness sensors. This finally let's
us drop direct backlight control from g-s-d.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3751>

data/dbus-interfaces/meson.build
data/dbus-interfaces/org.gnome.Shell.Brightness.xml [new file with mode: 0644]
data/gnome-shell-dbus-interfaces.gresource.xml
js/ui/main.js
js/ui/shellDBus.js

index 81281b64d57b92338a1bd1bbd8ef9faa38f613e7..43357070fe348e181d30fbed9f7b133fa3f68d59 100644 (file)
@@ -1,4 +1,5 @@
 dbus_interfaces = [
+  'org.gnome.Shell.Brightness.xml',
   'org.gnome.Shell.Extensions.xml',
   'org.gnome.Shell.Introspect.xml',
   'org.gnome.Shell.PadOsd.xml',
diff --git a/data/dbus-interfaces/org.gnome.Shell.Brightness.xml b/data/dbus-interfaces/org.gnome.Shell.Brightness.xml
new file mode 100644 (file)
index 0000000..a0e6397
--- /dev/null
@@ -0,0 +1,45 @@
+<!DOCTYPE node PUBLIC
+'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
+'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
+<!--
+  SPDX-License-Identifier: GPL-3.0-or-later
+-->
+<node>
+
+  <!--
+      org.gnome.Shell.Brightness:
+      @short_description: Brightness interface
+
+      The interface used to give the shell brightness related information.
+  -->
+  <interface name="org.gnome.Shell.Brightness">
+
+    <!--
+        SetDimming:
+        @enable: whether to enabled dimming
+
+        Enable or disable screen dimming to save power.
+    -->
+    <method name="SetDimming">
+      <arg type="b" direction="in" name="enable"/>
+    </method>
+
+    <!--
+        SetAutoBrightnessTarget:
+        @luminance: the target brightness
+
+        This lets the auto brightness system tell the shell what the ideal
+        relative brightness [0,1] is.
+    -->
+    <method name="SetAutoBrightnessTarget">
+      <arg type="d" direction="in" name="target"/>
+    </method>
+
+    <!--
+        HasBrightnessControl:
+        If any display has brightness control.
+    -->
+    <property name="HasBrightnessControl" type="b" access="read"/>
+
+  </interface>
+</node>
index 69ce52927ae4d306f4b1e89b46354042a1ab595a..9866ac87cbccbc02cd7dc5a72d596527621c1a92 100644 (file)
@@ -40,6 +40,7 @@
     <file preprocess="xml-stripblanks">org.gnome.SettingsDaemon.Power.Keyboard.xml</file>
     <file preprocess="xml-stripblanks">org.gnome.SettingsDaemon.Rfkill.xml</file>
     <file preprocess="xml-stripblanks">org.gnome.Shell.AudioDeviceSelection.xml</file>
+    <file preprocess="xml-stripblanks">org.gnome.Shell.Brightness.xml</file>
     <file preprocess="xml-stripblanks">org.gnome.Shell.CalendarServer.xml</file>
     <file preprocess="xml-stripblanks">org.gnome.Shell.ClocksIntegration.xml</file>
     <file preprocess="xml-stripblanks">org.gnome.Shell.Extensions.xml</file>
index cd2417a6e0c650a9616b78debbbcc619a2babc9a..0de79d6a17a6e66f7437e840c504d3da83308632 100644 (file)
@@ -98,6 +98,7 @@ export let breakManagerDispatcher = null;
 export let timeLimitsManager = null;
 export let timeLimitsDispatcher = null;
 export let brightnessManager = null;
+export let brightnessDBus = null;
 
 let _startDate;
 let _defaultCssStylesheet = null;
@@ -261,6 +262,7 @@ async function _initializeUI() {
     timeLimitsDispatcher = new TimeLimitsManager.TimeLimitsDispatcher(timeLimitsManager);
 
     brightnessManager = new BrightnessManager.BrightnessManager();
+    brightnessDBus = new ShellDBus.BrightnessDBus(brightnessManager);
 
     global.connect('shutdown', () => {
         // Block shutdown until the session history file has been written
index 4f219e21f451f22735c56e068cf2e77c488e65e6..9b91c7fb400e1a136ad6797c4c62eb7b53b206de 100644 (file)
@@ -17,6 +17,7 @@ const GnomeShellIface = loadInterfaceXML('org.gnome.Shell');
 const GnomeShellExtensionsIface = loadInterfaceXML('org.gnome.Shell.Extensions');
 const ScreenSaverIface = loadInterfaceXML('org.gnome.ScreenSaver');
 const ScreenTimeIface = loadInterfaceXML('org.gnome.Shell.ScreenTime');
+const BrightnessIface = loadInterfaceXML('org.gnome.Shell.Brightness');
 
 export class GnomeShell {
     constructor() {
@@ -585,3 +586,40 @@ export class ScreenTimeDBus {
         return this._manager.lastBreakEndTime;
     }
 }
+
+export class BrightnessDBus {
+    constructor(brightnessManager) {
+        this._manager = brightnessManager;
+
+        this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(BrightnessIface, this);
+        this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Brightness');
+
+        Gio.DBus.session.own_name('org.gnome.Shell.Brightness',
+            Gio.BusNameOwnerFlags.NONE, null, null);
+
+        this._manager.connectObject('changed', this._sync.bind(this), this);
+        this._sync();
+    }
+
+    _sync() {
+        const hasBrightnessControl = !!this._manager.globalScale;
+        if (hasBrightnessControl === this._hasBrightnessControl)
+            return;
+
+        this._hasBrightnessControl = hasBrightnessControl;
+        this._dbusImpl.emit_property_changed('HasBrightnessControl',
+            new GLib.Variant('b', this._hasBrightnessControl));
+    }
+
+    SetDimming(enable) {
+        this._manager.dimming = enable;
+    }
+
+    SetAutoBrightnessTarget(target) {
+        this._manager.autoBrightnessTarget = target;
+    }
+
+    get HasBrightnessControl() {
+        return this._hasBrightnessControl;
+    }
+}